﻿using System;
using System.Data;
using MySql.Data.MySqlClient;
using SiGeCoPre.Presupuesto_Conexion;
using SiGeCoPre.Presupuesto_Entities;
using SiGeCoPre.Presupuesto_Excepcion;
using SiGeCoPre.Presupuesto_Util;

namespace SiGeCoPre.Presupuesto_DAOIMPL
{
    /// <summary>
    /// Clase que implementa DAORepuestos
    /// </summary>
    class DAOIMPLRepuestos:Presupuesto_DAO.DAORepuestos
    {
        /// <summary>
        /// Guarda un repuesto
        /// </summary>
        /// <param name="descripcion">Descripción del repuesto</param>
        /// <param name="codigo">Código del repuesto</param>
        /// <param name="precio">Precio del repuesto</param>
        /// <param name="activo">Determina si está activo en la base de datos</param>
        /// <returns>Devuelve true si fue ingresado correctamente o false si falló</returns>
        public bool saveRepuesto(string descripcion, string codigo, double precio, bool activo)
        {
             Boolean correcto = false;
             MySqlConnection conexion = Conexion.conexionMySQL();
            try
            {
                
                conexion.Open();
                MySqlCommand insertar = conexion.CreateCommand();
                insertar.CommandText = "INSERT INTO repuestos(Descripcion, Codigo, Precio, Activo) VALUES(@descripcion, @codigo, @precio, @activo)";
                insertar.Parameters.AddWithValue("@descripcion", descripcion);
                insertar.Parameters.AddWithValue("@codigo", codigo);
                insertar.Parameters.AddWithValue("@precio", precio);
                insertar.Parameters.AddWithValue("@activo", activo);
                insertar.ExecuteNonQuery();
                correcto = true;
                conexion.Close();
                conexion.Dispose();
            }
            catch (Exception ex)
            {
                correcto = false;
                conexion.Close();
                conexion.Dispose();
                Texto.escribirLog(ex.Message);
                throw new DAOException(ex.Message);
            }

            return correcto;
        }
            
        /// <summary>
        /// Modifica un sector
        /// </summary>
        /// <param name="descripcion">Descripción del repuesto</param>
        /// <param name="codigo">Código del repuesto</param>
        /// <param name="precio">Precio del repuesto</param>
        /// <param name="activo">Determina si está activo en la base de datos</param>
        /// <param name="idRepuesto">Determina el repuesto a modificar</param>
        /// <returns>Devuelve true si fue modificado correctamente o false si falló</returns>
        public bool updateRepuesto(string descripcion, string codigo, double precio, bool activo, int idRepuesto)
        {
            Boolean correcto = false;
            MySqlConnection conexion = Conexion.conexionMySQL();
            try
            {

                conexion.Open();
                MySqlCommand modificar = conexion.CreateCommand();
                modificar.CommandText = "UPDATE repuestos SET Descripcion = @descripcion, Codigo = @codigo, Precio = @precio, Activo = @activo WHERE id = @idRepuesto ";
                modificar.Parameters.AddWithValue("@descripcion", descripcion);
                modificar.Parameters.AddWithValue("@codigo", codigo);
                modificar.Parameters.AddWithValue("@precio", precio);
                modificar.Parameters.AddWithValue("@activo", activo);
                modificar.Parameters.AddWithValue("@idRepuesto", idRepuesto);
                modificar.ExecuteNonQuery();
                correcto = true;
                conexion.Close();
                conexion.Dispose();
            }
            catch (Exception ex)
            {
                correcto = false;
                conexion.Close();
                conexion.Dispose();
                Texto.escribirLog(ex.Message);
                throw new DAOException(ex.Message);
            }

            return correcto;
        }

        /// <summary>
        /// Elimina un repuesto
        /// </summary>
        /// <param name="codigo">Determina el repuesto a eliminar</param>
        /// <returns>Devuelve true si fue eliminado correctamente o false si falló</returns>
        public bool deleteRepuesto(string codigo)
        {
            Boolean correcto = false;
            MySqlConnection conexion = Conexion.conexionMySQL();
            try
            {

                conexion.Open();
                MySqlCommand eliminar = conexion.CreateCommand();
                eliminar.CommandText = "UPDATE repuestos SET Activo = @activo WHERE Codigo = @codigo";
                eliminar.Parameters.AddWithValue("@activo", 0);
                eliminar.Parameters.AddWithValue("@codigo", codigo);
                eliminar.ExecuteNonQuery();
                correcto = true;
                conexion.Close();
                conexion.Dispose();
            }
            catch (Exception ex)
            {
                correcto = false;
                conexion.Close();
                conexion.Dispose();
                Texto.escribirLog(ex.Message);
                throw new DAOException(ex.Message);
            }

            return correcto;
        }

        /// <summary>
        /// Lista los repuestos
        /// </summary>
        /// <returns>Devuelve una tabla con todos los repuestos</returns>
        public DataTable getAllRepuestos()
        {
            DataTable repuestos = new DataTable();
            MySqlConnection conexion = Conexion.conexionMySQL();
            try
            {

                conexion.Open();
                MySqlCommand listado = conexion.CreateCommand();
                listado.CommandText = "SELECT * FROM repuestos";
                MySqlDataAdapter adaptador = new MySqlDataAdapter(listado);
                adaptador.Fill(repuestos);
                adaptador.Dispose();
                conexion.Close();
                conexion.Dispose();

            }
            catch (Exception ex)
            {
                repuestos = null;
                conexion.Close();
                conexion.Dispose();
                Texto.escribirLog(ex.Message);
                throw new DAOException(ex.Message);
            }

            return repuestos;
        }

        /// <summary>
        /// Obtiene un repuesto
        /// </summary>
        /// <param name="codigo">Determina el repuesto a obtener</param>
        /// <returns>Devuelve un objeto repuesto</returns>
        public repuestos getRepuesto(string codigo)
        {
            repuestos repuesto = new repuestos();
            MySqlConnection conexion = Conexion.conexionMySQL();
            try
            {

                conexion.Open();
                MySqlCommand consulta = conexion.CreateCommand();
                consulta.CommandText = "SELECT * FROM repuestos WHERE Codigo = @codigo";
                consulta.Parameters.AddWithValue("@codigo", codigo);
                MySqlDataReader lector = consulta.ExecuteReader();
                while (lector.Read())
                {
                    repuesto.ID = Convert.ToInt16(lector["id"].ToString());
                    repuesto.Codigo = lector["Codigo"].ToString();
                    repuesto.Descripcion = lector["Descripcion"].ToString();
                    repuesto.Precio = Convert.ToDouble(lector["precio"].ToString());
                    repuesto.Activo = Convert.ToBoolean(lector["Activo"].ToString());
                }
                lector.Close();
                lector.Dispose();
                conexion.Close();
                conexion.Dispose();

            }
            catch (Exception ex)
            {
                repuesto = null;
                conexion.Close();
                conexion.Dispose();
                Texto.escribirLog(ex.Message);
                throw new DAOException(ex.Message);
            }

            return repuesto;
        }
    }
}
